package com.zzyk.main.mapper;

import com.zzyk.main.model.pojo.AlarmInfo;
import com.zzyk.main.model.pojo.AlarmMsgLog;
import com.zzyk.main.model.pojo.CommonCount;
import com.zzyk.main.model.vo.AlarmInfoToMonth;
import com.zzyk.main.model.vo.CommonKeyValue;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author wss_PC
 */
@Mapper
public interface AlarmInfoMapper {

    /**
     * 根据传入的参数做查询（多条件查询）
     *
     * @param eId        企业ID
     * @param dId        设备ID
     * @param beginTime  开始时间
     * @param endTime    结束时间
     * @param status     状态
     * @param areas
     * @param deviceList
     * @return
     */
    List<AlarmInfo> selectAlarmInfoByParams(@Param("eId") Long eId, @Param("dId") Long dId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime, @Param("status") Long status, @Param("areas") String[] areas, @Param("deviceList") Integer[] deviceList);

    /**
     * 通过ID进行删除
     *
     * @param id
     * @return
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * 根据传入对象进行添加
     *
     * @param record
     * @return
     */
    int insert(AlarmInfo record);

    /**
     * 添加，如果对象内参数不为NULL就插入
     *
     * @param record
     * @return
     */
    int insertSelective(AlarmInfo record);

    /**
     * 根据主键查询
     *
     * @param id
     * @return
     */
    AlarmInfo selectByPrimaryKey(Integer id);

    /**
     * 根据对象传入参数进行更新
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(AlarmInfo record);

    /**
     * 根据主键更新
     *
     * @param record
     * @return
     */
    int updateByPrimaryKey(AlarmInfo record);

    /**
     * 统计各个报警状态的值
     *
     * @param areas
     * @param enterprise
     * @return
     */
    List<CommonCount> selectCountAlarm(@Param("areas") String[] areas, @Param("enterprise") Long enterprise);

    /**
     * 多参数查询报警推送日志
     *
     * @param eId
     * @param beginTime
     * @param endTime
     * @param status
     * @param areas
     * @param type
     * @return
     */
    List<AlarmMsgLog> selectAlarmMsgLog(@Param("eId") Long eId, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime, @Param("status") String status, @Param("areas") String[] areas, @Param("type") Integer type);

    /**
     * 获取今天报警数量
     *
     * @param areas
     * @param enterprise
     * @param deviceList
     * @return
     */
    CommonCount selectToDayAlarm(@Param("areas") String[] areas, @Param("enterprise") Long enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取本周的报警数量
     *
     * @param areas
     * @param enterprise
     * @param deviceList
     * @return
     */
    CommonCount selectThisweekAlarm(@Param("areas") String[] areas, @Param("enterprise") Long enterprise, Integer[] deviceList);

    /**
     * 获取前十条报警
     *
     * @param eId
     * @param dId
     * @param bTime
     * @param eTime
     * @param status
     * @return
     */
    List<AlarmInfo> selectAlarmInfoByParamsTop10(@Param("eId") Long eId, @Param("dId") Long dId, @Param("bTime") Date bTime, @Param("eTime") Date eTime, @Param("status") Long status);

    CommonCount selectUntreatedAlarm(@Param("areas") String[] areas, @Param("enterprise") Long enterprise, @Param("eId") Long eId, @Param("dId") Long dId, @Param("bTime") Date bTime, @Param("eTime") Date eTime, Integer[] deviceList);

    CommonCount selectNotRecoveredAlarm(@Param("areas") String[] areas, @Param("enterprise") Long enterprise, @Param("eId") Long eId, @Param("dId") Long dId, @Param("bTime") Date bTime, @Param("eTime") Date eTime, Integer[] deviceList);


    /**
     * 查询每个企业
     *
     * @param enterprise
     * @param offsetMonth
     * @param param
     * @param deviceList
     * @return
     */
    Integer findCountAlarm(@Param("enterprise") Integer enterprise, @Param("offsetMonth") Date offsetMonth, @Param("param") String param, @Param("deviceList") Integer[] deviceList);

    /**
     * 查询某个月报警最多的设备信息和条数
     *
     * @param enterprise
     * @param offsetMonth
     * @param deviceList
     * @return
     */
    CommonKeyValue selectlastMonthDeviceData(@Param("enterprise") Integer enterprise, @Param("offsetMonth") Date offsetMonth, @Param("param") String param, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<AlarmInfoToMonth> selectToMonthAlarmData(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据开始时间和结束时间统计 这两天各个小时的报警数量
     *
     * @param toDay
     * @param yesTerDay
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<Integer, Integer>> selectCountAlarmsByHour(@Param("toDay") String toDay, @Param("yesTerDay") String yesTerDay, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 统计某天各个报警状态的数量
     *
     * @param day
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<String, Integer>> countToDayAlarmNumber(@Param("day") String day, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据报警内容分组
     *
     * @param beginDate
     * @param endDate
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<String, Integer>> selectAlarmNumberGroupByContent(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据设备类型统计告警数量，并且统计多少设备
     *
     * @param beginDate
     * @param endDate
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<String, Integer>> selectAlarmDeviceType(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 统计某个时间范围和企业ID统计每天的告警数量
     *
     * @param beginDate
     * @param endDate
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<String, Integer>> selectAlarmStatistics(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取某个时间范围内告警处理信息
     *
     * @param beginDate
     * @param endDate
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<Map<String, Integer>> selectAlarmHandlingInformation(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据类型和企业ID 报警时间查询报警信息
     *
     * @param type
     * @param enterprise
     * @param dateStr
     * @param methodType
     * @return
     */
    List<AlarmInfo> selectRecentAlertNotification(@Param("type") Integer type, @Param("enterprise") Integer enterprise, @Param("dateStr") String dateStr, @Param("methodType") Integer methodType);

    List<AlarmInfo> selectAlarmCountBy(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);
}